/*
    异步 echo server
    添加逻辑线程处理网络收到的任务

    开多个线程，每一个线程都使用同一个 io_context
    IOThreadPool模式有一个隐患，同一个socket的就绪后，触发的回调函数可能在不同的线程里，比如第一次是在线程1，第二次是在线程3，
    如果这两次触发间隔时间不大，那么很可能出现不同线程并发访问数据的情况，比如在处理读事件时，第一次回调触发后我们从socket的接
    收缓冲区读数据出来，第二次回调触发,还是从socket的接收缓冲区读数据，就会造成两个线程同时从socket中读数据的情况，会造成数据混乱。

    对于多线程触发回调函数的情况，我们可以利用asio提供的串行类strand封装一下，这样就可以被串行调用了，其基本原理就是在线程各自调用
    函数时取消了直接调用的方式，而是利用一个strand类型的对象将要调用的函数投递到strand管理的队列中，再由一个统一的线程调用回调函数，
    调用是串行的，解决了线程并发带来的安全问题。
*/

#include "server.h"
#include "asio_thread_poll.h"
#include "singleton.hpp"

#include <mutex>

int main(void)
{
    try
    {
        auto& ioc = Singleton<AsioThreadPool>::GetInstance()->get_io_context();
        Server server(ioc, 12345); 
        
        sleep(10);
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}